package com.quectel.constant.global;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;

/**
 * 系统常量
 *
 * @author caolu
 * @email louis.cao@quectel.com
 */
public class SystemConstants {

    /**
     * 定时任务分片键名
     */
    public static final Pair<String, String> SHARDING_SLOT_KEY_PAIR = ImmutablePair.of("shardingTotalCount", "shardingItem");


    /**
     * 空字符串
     */
    public static final String EMPTY_STR = "";

    /**
     * null字符串
     */
    public static final String NULL_STR = "null";

    /**
     * 隐藏字符串
     */
    public static final String HIDE_STR = "*********";


    /**
     * 不存在的id
     */
    public static final String NONEXISTENT_ID = "-1";

    /**
     * 表示正向意义
     */
    public static final Byte YES = 1, ENABLE = 1, COMMON = 1, NORMAL = 1, SUCCESS = 1;


    /**
     * 表示正向意义
     */
    public static final String YES_CHINESE = "是", NO_CHINESE = "否", RIGHT_CHINESE = "对", WRONG_CHINESE = "错";
    /**
     * 表示反向意义
     */
    public static final Byte NO = 0, DISABLE = 0, ABNORMAL = 0, ZERO = 0, FAIL = 0;


    /**
     * 男1 女0
     */
    public static final Byte MALE = 1, FEMALE = 0;

    /**
     * 中文男女
     */
    public static final String MALE_CHINESE = "男", FEMALE_CHINESE = "女";

    /**
     * 1员工 2访客
     */
    public static final Byte HOUSEHOLD = 1, VISITOR = 2, STAFF = 3;

    /**
     * 出入 0未知 1进 2出
     */
    public static final Byte UNKNOWN_IN_OR_OUT = 0, IN = 1, OUT = 2;

    /**
     * 默认排序值
     */
    public static final Integer DEFAULT_SORT = 1;

    /**
     * 树形结构数据根节点parentId
     */
    public static final Long TREE_DEFAULT_PARENT_ID = -1L;

    /**
     * 树形结构数据默认level
     */
    public static final Byte TREE_DEFAULT_LEVEL = 1;

    /**
     * 实体类id标识
     */
    public static final String ENTITY_ID_FLAG = "id";

    /**
     * 实体类id集合标识
     */
    public static final String ENTITY_ID_COLLECTION_FLAG = "ids";

    /**
     * mongo实体类id标识
     */
    public static final String MONGO_ENTITY_ID_FLAG = "_id";

    /**
     * 多状态标识
     */
    public static final String STATUSES = "statuses";
    /**
     * 多状态标识
     */
    public static final String PAY_STATUSES = "payStatuses";

    /**
     * 多状态标识
     */
    public static final String STATUS_FLAG = "statusFlag";

    /**
     * 非法的数据操作
     */
    public static final String ILLEGAL_MSG = "非法的数据操作";

    /**
     * 值不为空缓存时间为多长时间(s)
     */
    public static final int NOT_NULL_CACHE_EXPIRE_SECONDS = 5 * 60;
    /**
     * 值为空缓存时间为多长时间(s)
     */
    public static final int NULL_CACHE_EXPIRE_SECONDS = 1 * 60;
    /**
     * 时间段启止时间键名
     */
    public static final Pair<String, String> TIME_SLOT_KEY_PAIR = ImmutablePair.of("startTime", "endTime");

    /**
     * 排序键名
     */
    public static final String SORT_ORDER_BY_KEY = "orderName", SORT_ORDER_RULE_KEY = "order";

    /**
     * 排序规则
     */
    public static final String SORT_ORDER_RULE_DESC = "desc", SORT_ORDER_RULE_ASC = "asc";

    /**
     * 短横线
     */
    public static final String SHORT_HORIZONTAL_LINE = "-";


    @AllArgsConstructor
    @NoArgsConstructor
    public enum ApiPath {
        //cms路径
        CMS_PATH("/cmsapi/"),

        //emp路径
        EMP_PATH("/empapi/"),

        // 网格模块路径
        GRID_PATH("/gridapi/"),

        //移动端路径
        MOBILE_PATH("/mobileapi/"),

        //采集模块路径
        COLLECT_PATH("/dmsapi/");

        @Getter
        private String path;
    }

    /**
     * 标点符号
     */
    public static final String COLON = ":";

    /**
     * 公众号类型 支付宝 微信
     */
    //支付宝
    public static final Byte OFFICIAL_ACCOUNTS_PLATFORM_ZHB = PayType.ZFB.getType();
    //微信
    public static final Byte OFFICIAL_ACCOUNTS_PLATFORM_WX = PayType.WX.getType();

    /**
     * platformUser拼接function
     */
    public static String buildPlatformUserUniqueFlag(Byte officialType, String appId, String openId) {
        return String.format("%s_%s_%s", officialType, appId, openId);
    }

    /**
     * 支付类型
     */
    @AllArgsConstructor
    @NoArgsConstructor
    public enum PayType {
        /**
         * 支付宝
         */
        ZFB((byte) 1),
        /**
         * 微信
         */
        WX((byte) 2),
        /**
         * 小程序
         */
        SMALL_SOFT((byte) 3);

        @Getter
        @Setter
        private Byte type;

    }

    /**
     * 支付配置类型
     */
    @AllArgsConstructor
    @NoArgsConstructor
    public enum PayConfigType {
        /**
         * 支付宝
         */
        ZHB((byte) 1),
        /**
         * 微信JSAPI
         */
        WX_JSAPI((byte) 2),
        /**
         * 微信app
         */
        WX_APP((byte) 3);

        @Getter
        @Setter
        private Byte type;

    }

    /**
     * 移动端类型 安卓 iOS
     */
    @AllArgsConstructor
    @NoArgsConstructor
    public enum MobileType {
        /**
         * 安卓
         */
        ANDROID((byte) 1),
        /**
         * iOS
         */
        IOS((byte) 2);

        @Getter
        @Setter
        private Byte type;
    }

    /**
     * 移动端类型
     */
    @AllArgsConstructor
    @NoArgsConstructor
    public enum TerminalType {
        /**
         * JSAPI
         */
        JSAPI((byte) 1),
        /**
         * APP
         */
        APP((byte) 2),
        /**
         * 小程序
         */
        SMALL_SOFT((byte) 3);

        @Getter
        @Setter
        private Byte type;
    }


    /**
     * 登录类型
     */
    @AllArgsConstructor
    @NoArgsConstructor
    public enum LoginType {
        /**
         * JSAPI登录
         */
        JS_API((byte) 1),
        /**
         * 安卓登录
         */
        ANDROID((byte) 2),
        /**
         * IOS登录
         */
        IOS((byte) 3);

        @Getter
        @Setter
        private Byte type;
    }

    /**
     * 平台人员类型划分
     */
    @AllArgsConstructor
    public enum PlatformPersonType {
        /**
         * 住户
         */
        HOUSEHOLD((byte) 1),
        /**
         * 访客
         */
        VISITOR((byte) 2),
        /**
         * 后台管理员
         */
        ADMIN((byte) 3),
        ;
        /**
         * 人员类型
         */
        @Getter
        @Setter
        private Byte type;
    }


}
